//
// Created by Mzoro on 2022/3/29.
//
#include <stdio.h>

/**
 * 交换两个变量的值
 * @param a
 * @param b
 */
void swap(int *a, int *b);
int main() {
    int x = 50, y = 5, arr[5] = {0,1,2,3,4};

    // 定义一个int型的指针
    int *ip, *ip2;

    // 变量ip指向 x 变量
    ip = &x;
    printf("ip value is %d \n", *ip);
    *ip = 55;
    printf("x is %d \n", x);
    ip2 = ip;
    printf("ip2 is %d\n",*ip2);
    // 这一句需分成两部分， *ip 和 ++， 所以这一行的意思是将 ip 指向的值加1，相当于 x++
    // 括号不能少
    (*ip)++;
    printf("x is %d \n", x);

    ip = &arr[4];
    printf("ip's value is %d\n", *ip);
    printf("ip is %p,%p \n", ip,&arr[4]);
    ip = arr;
    printf("can not use reference to calculate an array's length, %ld \n", sizeof(ip) / sizeof(arr[0]));
    /*
     * 对于数组还有更多的说法,例子中 数组arr变量本身就是一个指针，但也不单单是一个指针.
     * 变量arr指向的是这一组数中第一个数的内存地址。
     * 求数组长度时可以使用下面的方式 int len = sizeof(arr) / sizeof(arr[0]); 这时 arr 只能是一个数组变量，而不能用一个指针代替
     */
    int len = sizeof(arr) / sizeof(arr[0]);
    for(int i=0; i<len; i++){
        printf("%d  ", *(arr+i) );  //*(arr+i)等价于arr[i]
    }
    printf("\n");

    // 下面是通过指针交换两个变量的值
    int a = 10, b = 20;
    printf("before swap a and b, %d,%d \n", a, b);
    swap(&a, &b);
    printf("after swap a and b, %d,%d \n", a, b);

    return 0;
}

void swap(int *a, int *b){
    int tmp = *a;
    *a = *b;
    *b = tmp;
}